package swingset;
/*
 *
 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;

/**
 * JProgressBar Demo
 *
 * @author Jeff Dinkins # @author Peter Korn (accessibility support)
 */
public class ProgressBarDemo extends DemoModule
{

	/**
	 * main method allows us to run as a standalone demo.
	 */
	public static void main(String[] args)
	{
		ProgressBarDemo demo = new ProgressBarDemo(null);
		demo.mainImpl();
	}

	/**
	 * ProgressBarDemo Constructor
	 */
	public ProgressBarDemo(SwingSet2 swingset)
	{
		// Set the title for this demo, and an icon used to represent this
		// demo inside the SwingSet2 app.
		super(swingset, "ProgressBarDemo", "toolbar/JProgressBar.gif");

		createProgressPanel();
	}

	javax.swing.Timer timer = new javax.swing.Timer(18, createTextLoadAction());
	Action loadAction;
	Action stopAction;
	JProgressBar progressBar;
	JTextArea progressTextArea;

	@Override
	void updateDragEnabled(boolean dragEnabled)
	{
		progressTextArea.setDragEnabled(dragEnabled);
	}

	public void createProgressPanel()
	{
		getDemoPanel().setLayout(new BorderLayout());

		JPanel textWrapper = new JPanel(new BorderLayout());
		textWrapper.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
		textWrapper.setAlignmentX(LEFT_ALIGNMENT);
		progressTextArea = new MyTextArea();

		progressTextArea.getAccessibleContext().setAccessibleName(
				getString("ProgressBarDemo.accessible_text_area_name"));
		progressTextArea.getAccessibleContext().setAccessibleName(
				getString("ProgressBarDemo.accessible_text_area_description"));
		textWrapper.add(new JScrollPane(progressTextArea), BorderLayout.CENTER);

		getDemoPanel().add(textWrapper, BorderLayout.CENTER);

		JPanel progressPanel = new JPanel();
		getDemoPanel().add(progressPanel, BorderLayout.SOUTH);

		progressBar = new JProgressBar(JProgressBar.HORIZONTAL, 0,
				text.length())
		{
			@Override
			public Dimension getPreferredSize()
			{
				return new Dimension(300, super.getPreferredSize().height);
			}
		};
		progressBar.getAccessibleContext().setAccessibleName(
				getString("ProgressBarDemo.accessible_text_loading_progress"));
		progressBar.setIndeterminate(true);
		progressBar.setStringPainted(true);

		progressPanel.add(progressBar);
		progressPanel.add(createLoadButton());
		progressPanel.add(createStopButton());
	}

	public JButton createLoadButton()
	{
		loadAction = new AbstractAction(
				getString("ProgressBarDemo.start_button"))
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				loadAction.setEnabled(false);
				stopAction.setEnabled(true);
				progressBar.setIndeterminate(false);
				if (progressBar.getValue() == progressBar.getMaximum())
				{
					progressBar.setValue(0);
					textLocation = 0;
					progressTextArea.setText("");
				}
				timer.start();
			}
		};
		return createButton(loadAction);
	}

	public JButton createStopButton()
	{
		stopAction = new AbstractAction(
				getString("ProgressBarDemo.stop_button"))
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				timer.stop();
				loadAction.setEnabled(true);
				stopAction.setEnabled(false);
			}
		};
		return createButton(stopAction);
	}

	public JButton createButton(Action a)
	{
		JButton b = new JButton();
		// setting the following client property informs the button to show
		// the action text as it's name. The default is to not show the
		// action text.
		b.putClientProperty("displayActionText", Boolean.TRUE);
		b.setAction(a);
		return b;
	}

	int textLocation = 0;

	String text = getString("ProgressBarDemo.text");

	public Action createTextLoadAction()
	{
		return new AbstractAction("text load action")
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				if (progressBar.getValue() < progressBar.getMaximum())
				{
					progressBar.setValue(progressBar.getValue() + 1);
					progressTextArea.append(
							text.substring(textLocation, textLocation + 1));
					textLocation++;
				} else
				{
					timer.stop();
					loadAction.setEnabled(true);
					stopAction.setEnabled(false);
					progressBar.setIndeterminate(true);
				}
			}
		};
	}

	class MyTextArea extends JTextArea
	{
		public MyTextArea()
		{
			super(null, 0, 0);
			setEditable(false);
			setText("");
		}

		@Override
		public float getAlignmentX()
		{
			return LEFT_ALIGNMENT;
		}

		@Override
		public float getAlignmentY()
		{
			return TOP_ALIGNMENT;
		}
	}
}
